#ifndef COMPRESORARITMETICO_H_
#define COMPRESORARITMETICO_H_

#include "Singleton.h"
#include <string>
#include "ManejadorBits.h"
#include "TablaDeFrecuencias.h"

using namespace std;

namespace Toolkit
{

class CompresorAritmetico : public Singleton<CompresorAritmetico>
{

public:

	CompresorAritmetico();
	virtual ~CompresorAritmetico();

	string comprimir(const string &stringAcomprimir);
	string descomprimir(const string stringAdescomprimir);

private:

	unsigned int piso;
	unsigned int techo;
	ManejadorBits manejadorBits;

	void comprimirCaracter(const unsigned char &caracterAcomprimir,
						   TablaDeFrecuencias &tablaFrecuencia);

	unsigned int descomprimirCaracter(	TablaDeFrecuencias &tablaDescompresion, unsigned int &ventana,
										unsigned int &tamanoInfoComprimida,	unsigned int &ultimoBitEmitido,
										string &resultadoDescomprimido);

	void comprimirUltimoCaracter(const unsigned char &caracterAcomprimir,
						   TablaDeFrecuencias &tablaFrecuencia);

	unsigned int obtenerTamanoPadding(const string infoComprimida) const;

	void emitirPiso();

	void calcularRango(	const unsigned char simbolo, TablaDeFrecuencias &tablaFrecuencia,
						unsigned int &nuevoPiso, unsigned int &nuevoTecho) const;

	void cargarVentana(	unsigned int &ventana, const string fuente,
						const unsigned int cantidadBits, unsigned int &UltimoBitEmitido);

	unsigned char buscarSimbolo (const unsigned int ventana, TablaDeFrecuencias &tabla,
								 unsigned int &npiso, unsigned int &ntecho);


};

}

#endif /* COMPRESORARITMETICO_H_ */
